public class code2 {

//    牛客 top101 实现树的反序列化在通过反序列化推出树
    // 这个方法实现序列化

    public String Serialize(TreeNode root) {
        //处理空树
        if(root == null)
            return "#";
        StringBuilder res = new StringBuilder();
        SerializeFunction(root, res);
        //把str转换成char

        System.out.println(res);
        return res.toString();
    }
    private void SerializeFunction(TreeNode root, StringBuilder str){
        //如果节点为空，表示左子节点或右子节点为空，用#表示
        if(root == null){
            // 需要注意的是，即使这里被判定为 null 这里也需要添加上 ，
            str.append('#').append(",");
            return;
        }
        //根节点
        str.append(root.val).append(',');
        //左子树
        SerializeFunction(root.left, str);
        //右子树
        SerializeFunction(root.right, str);
    }

    // 这个方法可以实现反序列化
    TreeNode Deserialize(String str) {
        // 这里将获取到 String 字符串按照前面的分割符 ， 将其存储在数组中
        String[] arr = str.split(",");
        // 这里创建一个顺序表，将每一个元素存储到顺序表中
        Queue<String> list = new LinkedList<>();
        for (int i = 0; i != arr.length; i++) {
            list.add(arr[i]);
        }
        return ToDeserialize(list);
    }

    // 这里实现反序列化操作
    private static TreeNode ToDeserialize(Queue<String> q) {

        String flag = q.poll();
        if (flag.equals("#")) {
            return null;
        }

        // 这里需要注意的是，存入到 TreeNode 中的元素应该是 int 类型的，这里需要强制类型转换
        TreeNode head = new TreeNode(Integer.valueOf(flag));

        head.left = ToDeserialize(q);
        head.right = ToDeserialize(q);

        return head;
    }
}
